home *** CD-ROM | disk | FTP | other *** search
- /*********************************************************/
- /* casting.c */
- /* Contains QuickTime Conferencing specific stuff */
- /*********************************************************/
-
- #include "caster.h"
- #include "casting.h"
- #include "shared.h"
-
- /* Local Prototypes **************************************/
- ComponentResult HandleConferenceEvent ( CastRecord* cr, MTConferenceEventPtr confEvent );
- ComponentResult DoConferenceReady(CastRecord* cr, MTConferenceEventPtr confEvent);
- ComponentResult DoIncomingCall( CastRecord* cr, MTConferenceEventPtr confEvent );
- ComponentResult DoConferenceTerminated(CastRecord* cr, MTConferenceEventPtr confEvent);
- ComponentResult DoMemberReady(CastRecord* cr, MTConferenceEventPtr confEvent);
-
- pascal Boolean MyControllerActionFilter(MTControllerComponent mtc, MTControllerActionType action, void *params, long refCon);
-
- /* Globals ***********************************************/
- MTControllerActionFilterUPP actionFilterUPP = NewMTControllerActionFilterProc(MyControllerActionFilter);
- Boolean aTrue = true;
- Boolean aFalse = false;
-
- /***************************************************
- OpenCast
- ****************************************************/
- ComponentResult OpenCast( WindowPtr window, SeqGrabComponent sg, CastRecord** cr ) {
- ComponentResult err = noErr;
- CastRecord* newRecord = nil;
- Point origin = {0,0};
- Rect bounds = { 0, 0, 120 + 16, 160 };
-
- newRecord = (CastRecord*)NewPtrClear(sizeof (CastRecord));
-
- if (newRecord == nil)
- err = MemError();
-
- if (err == noErr) {
- newRecord->window = window;
- newRecord->sg = sg;
- }
-
- if (err == noErr) {
- newRecord->director = OpenDefaultComponent(kMTSourceStreamDirectorType, SeqGrabComponentType);
- if ( newRecord->director == nil)
- err = couldntGetRequiredComponent;
- }
-
- if (err == noErr) {
- newRecord->controller = OpenDefaultComponent( kMTControllerType, kMTMovieTalkSubType );
- if ( newRecord->controller == nil)
- err = couldntGetRequiredComponent;
- }
-
- if (err == noErr)
- err = MTControllerSetActionFilter(newRecord->controller, actionFilterUPP, 0);
-
- if (err == noErr)
- err = MTDirectorSetMediaComponent( newRecord->director, sg );
-
- if (err == noErr)
- err = MTControllerNewAttachedController(newRecord->controller, newRecord->director, window, origin);
-
- if (err == noErr)
- err = MTControllerDoAction( newRecord->controller, mtControllerActionSetShowSnapshot, &aFalse );
-
- if (err == noErr)
- err = MTControllerSetControllerBoundsRect(newRecord->controller, &bounds );
-
- if (err == noErr)
- *cr = newRecord;
- else
- CloseCast( newRecord );
-
- return err;
- }
-
- /***************************************************
- CloseCast
- ****************************************************/
- ComponentResult CloseCast( CastRecord* cr ) {
-
- ComponentResult err = noErr;
-
- StopCasting( cr );
-
- if (cr->controller)
- CloseComponent(cr->controller);
-
- if (cr->controller)
- CloseComponent(cr->director);
-
- DisposePtr( (Ptr)cr);
-
- err = MemError();
-
- return err;
- }
-
- /***************************************************
- StartCasting
- ****************************************************/
- ComponentResult StartCasting( CastRecord* cr, Str63 name ) {
-
- MTCString63 cName;
- ComponentResult err = noErr;
-
- PToCString( name, cName);
-
- cr->confComponent = OpenDefaultComponent(kMTConferenceType, kMTMovieTalkSubType);
-
- if ( cr->confComponent == nil)
- err = couldntGetRequiredComponent;
-
- if (err == noErr)
- err = MTConferenceSetMode(cr->confComponent, mtSendMediaModeMask+mtShareableModeMask);
-
- if (err == noErr)
- err = MTConferenceListen(cr->confComponent, cName, cName, (MTCString)"mtlkatlk\tMulticaster\x0D");
-
- if (err == noErr)
- cr->casting = true;
-
- return err;
- }
-
- /***************************************************
- IsCastEvent
- ****************************************************/
- Boolean IsCastEvent( CastRecord* cr, EventRecord* theEvent ) {
-
- ComponentResult result = MTControllerIsControllerEvent (cr->controller, theEvent );
-
- return result;
- }
-
- /***************************************************
- CheckCast
- ****************************************************/
- ComponentResult CheckCast( CastRecord* cr ) {
-
- ComponentResult err = noErr;
- MTConferenceEvent confEvent;
-
- if (cr->confComponent)
- if( MTConferenceGetNextEvent( cr->confComponent, &confEvent ) )
- err = HandleConferenceEvent(cr, &confEvent);
-
- return err;
- }
-
- /***************************************************
- HandleConferenceEvent
- ****************************************************/
- ComponentResult HandleConferenceEvent ( CastRecord* cr, MTConferenceEventPtr confEvent ) {
-
- ComponentResult err = noErr;
-
- /* like a user event handler, we switch on the different conference events */
- switch(confEvent->what){
-
- case mtConferenceReadyEvent:
- err = DoConferenceReady(cr, confEvent);
- break;
-
- case mtIncomingCallEvent:
- err = DoIncomingCall( cr, confEvent );
- break;
-
- case mtConferenceTerminatedEvent:
- err = DoConferenceTerminated(cr, confEvent);
- break;
-
- case mtMemberReadyEvent:
- err = DoMemberReady(cr, confEvent);
- break;
-
- case mtFailedEvent:
- err = confEvent->err;
- break;
-
- default:
- /* ignore all others */
- break;
- }
-
- if(confEvent->surprise)
- DisposeHandle(confEvent->surprise);
-
- return err;
- }
-
- /***************************************************
- DoConferenceReady
- ****************************************************/
- ComponentResult DoConferenceReady(CastRecord* cr, MTConferenceEventPtr confEvent) {
-
- ComponentResult err = noErr;
-
- if (cr->conference != 0)
- err = MTConferenceMerge(cr->confComponent, cr->conference, confEvent->who);
- else {
- cr->conference = confEvent->who;
- err = MTConferenceActivateConference(cr->confComponent, cr->conference, cr->controller);
- }
-
- return err;
- }
-
- /***************************************************
- DoIncomingCall
- ****************************************************/
- ComponentResult DoIncomingCall( CastRecord* cr, MTConferenceEventPtr confEvent ) {
-
- ComponentResult err = noErr;
-
- err = MTConferenceReply(cr->confComponent, confEvent->who, 0);
-
- return err;
- }
-
- /***************************************************
- DoConferenceTerminated
- ****************************************************/
- ComponentResult DoConferenceTerminated(CastRecord* cr, MTConferenceEventPtr confEvent) {
-
- ComponentResult err = noErr;
-
- if (cr->conference == confEvent->who) {
- cr->conference = 0;
- MTControllerDoAction(cr->controller, mtControllerActionPlay, &aTrue);
- }
-
- return err;
- }
-
- /***************************************************
- DoMemberReady
- ****************************************************/
- ComponentResult DoMemberReady(CastRecord* cr, MTConferenceEventPtr confEvent) {
-
- ComponentResult err = noErr;
-
- err = MTConferenceActivateMember(cr->confComponent, confEvent->who, 0);
-
- if (err == noErr)
- err = MTConferenceDetachMember(cr->confComponent, confEvent->who);
-
- return err;
- }
-
- /***************************************************
- CastChangedWindow
- ****************************************************/
- /* this little gem is needed to tell the sequence grabber
- when a window has been moved */
- ComponentResult CastChangedWindowBefore( CastRecord* cr, Boolean finished ) {
-
- ComponentResult err = noErr;
-
- err = MTDirectorChangedWindow(cr->director, finished);
-
- return err;
- }
-
- /***************************************************
- StopCasting
- ****************************************************/
- ComponentResult StopCasting( CastRecord* cr ) {
-
- ComponentResult err = noErr;
-
- if (cr->confComponent)
- CloseComponent(cr->confComponent);
-
- cr->confComponent = nil;
- cr->conference = 0;
-
- MTControllerDoAction(cr->controller, mtControllerActionPlay, &aTrue);
-
- cr->casting = false;
-
- return err;
- }
-
- /***************************************************
- CopyCast
- ****************************************************/
- ComponentResult CopyCast( CastRecord* cr, PicHandle* pic ) {
-
- ComponentResult err;
-
- err = MTControllerSnapshot(cr->controller, pic );
-
- return noErr;
- }
-
- /***************************************************
- IsCasting
- ****************************************************/
- Boolean IsCasting( CastRecord* cr ) {
- return cr->casting;
- }
-
- /***************************************************
- SetupSequenceGrabber
- ****************************************************/
- ComponentResult SetupSequenceGrabber( SeqGrabComponent* sg,
- SGChannel* soundChannel,
- SGChannel* videoChannel,
- UserData settings ) {
- ComponentResult err = noErr;
- SeqGrabComponent grabber = nil;
-
- *soundChannel = nil;
- *videoChannel = nil;
-
- grabber = OpenDefaultComponent( SeqGrabComponentType, 0);
-
- if (grabber == nil) {
- err = couldntGetRequiredComponent;
- }
- else {
- err = SGInitialize(grabber);
- if (err == noErr) {
- if (settings)
- {
- err = SGSetSettings( grabber, settings, 0 );
-
- if (err == noErr)
- {
- /* once the settings are set...
- figure out what the channels are,
- assuming maximum one video and one sound */
- SGChannel chan;
- OSType type;
- err = SGGetIndChannel(grabber, 1, &chan, &type);
- if (err == noErr) {
- if (type == VideoMediaType)
- *videoChannel = chan;
- if (type == SoundMediaType)
- *soundChannel = chan;
- err = SGGetIndChannel(grabber, 2, &chan, &type);
- if (err == noErr) {
- if (type == VideoMediaType)
- *videoChannel = chan;
- if (type == SoundMediaType)
- *soundChannel = chan;
- }
- }
- }
- }
- else {
- err = SGNewChannel(grabber, SoundMediaType, soundChannel);
- if (err == noErr)
- SGSetChannelUsage(*soundChannel, seqGrabPreview+seqGrabRecord);
-
- err = SGNewChannel(grabber, VideoMediaType, videoChannel);
- if (err == noErr) {
- SGSetFrameRate(*videoChannel, 0);
- SGSetVideoCompressorType(*videoChannel, 'rpza');
- SGSetChannelUsage(*videoChannel,
- seqGrabPreview +
- seqGrabRecord +
- seqGrabPlayDuringRecord);
- }
-
- /* reset if we had a problem opening
- a channel (like there was no digitizer...) */
- err = noErr;
- }
- }
- }
-
- if (err) {
- if (grabber)
- CloseComponent(grabber);
- grabber = nil;
- }
-
- *sg = grabber;
-
- return err;
- }
-
-
- /***************************************************
- MyControllerActionFilter
- ****************************************************/
- pascal Boolean MyControllerActionFilter(MTControllerComponent mtc,
- MTControllerActionType action,
- void* params, long refCon ) {
- void* unused1 = params;
- long unused2 = refCon;
- Boolean handled = false;
- WindowPtr controllerWindow = (WindowPtr)MTControllerGetControllerPort(mtc);
- Rect box;
-
- switch (action)
- {
- case mtControllerActionControllerSizeChanged:
- /* find out how big the controller is */
- MTControllerGetControllerBoundsRect(mtc, &box);
- /* resize the window accordingly */
- SizeWindow ( controllerWindow, box.right, box.bottom, true);
- break;
-
- case mtControllerActionStreamsChanged:
- MTControllerDoAction(mtc, mtControllerActionPlay, &aTrue);
- break;
-
- default:
- break;
- }
-
- return handled;
- }
-
- /***************************************************
- CastChannelSettings
- ****************************************************/
- ComponentResult CastChannelSettings( CastRecord* cr, SGChannel channel ) {
-
- ComponentResult err = noErr;
-
- err = MTControllerChangedStreams(cr->controller, false);
-
- if (err == noErr) {
- err = SGSettingsDialog(cr->sg, channel, 0, nil, 0, nil, nil);
- MTControllerChangedStreams( cr->controller, true );
- }
-
- return err;
- }
-